﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
using System.Threading;

namespace Numer0nServer
{
    // メモ: [リファクター] メニューの [名前の変更] コマンドを使用すると、コード、svc、および config ファイルで同時にクラス名 "Service1" を変更できます。
    // 注意: このサービスをテストするために WCF テスト クライアントを起動するには、ソリューション エクスプローラーで Service1.svc または Service1.svc.cs を選択し、デバッグを開始してください。
    public class Service1 : IService1
    {


        /// <summary>
        /// タイマー
        /// </summary>
        System.Timers.Timer mTimer = new System.Timers.Timer();

        /// <summary>
        /// 相手検索リスト
        /// </summary>
        private List<string> searchList = new List<string>();

        /// <summary>
        /// ユーザID格納情報
        /// </summary>
        public static Dictionary<string, object> userList = new Dictionary<string, object>();


        public string GetData(int value)
        {
            return string.Format("You entered: {0}", value);
        }

        public CompositeType GetDataUsingDataContract(CompositeType composite)
        {
            if (composite == null)
            {
                throw new ArgumentNullException("composite");
            }
            if (composite.BoolValue)
            {
                composite.StringValue += "Suffix";
            }
            return composite;
        }

        public string GetData2(int value)
        {
            return string.Format("You entered2: {0}", value);
        }

        
        /// <summary>
        /// 相手検索処理
        /// </summary>
        /// <param name="guid"></param>
        public void SerchPlayer(string guid)
        {


            if (mTimer == null)
            {
                mTimer.Elapsed += OnTimerElapsed;

                mTimer.Interval = 1000;
                mTimer.AutoReset = true;

                mTimer.Enabled = true;   


                if(userList.Count == 0)
                {
                    userList.Add("FIRST", guid);
                }
                else
                {
                    userList.Add("SECOND", guid);
                }

            }


            //対戦相手が見つからなかった:trueを返す
            //return true;
        }


        /// <summary>
        /// タイマー開始処理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnTimerElapsed(object sender, System.Timers.ElapsedEventArgs e)
        {


            //60秒計測
            if (searchList.Count != 60)
            {

                //タイマー(仮)の役割配列
                searchList.Add(String.Format("Time:{0}, ThreadID:{1}", e.SignalTime.ToString("HH:mm:ss"), Thread.CurrentThread.ManagedThreadId.ToString()));

                if (userList.Count <= 2)
                {
                    //2人プレイゲームなので要素が2になればタイマー処理終了
                    if (mTimer == null)
                    {
                        mTimer.Elapsed -= OnTimerElapsed;

                    }
                }

            }
            else
            {
                //インスタンス解放
                if(mTimer == null)
                {
                    mTimer.Elapsed -= OnTimerElapsed;
                }

            }

        }


        /// <summary>
        /// データ取得処理
        /// </summary>
        /// <returns></returns>
        public int GetUserData()
        {

            //GUIDにちなんだ先攻後攻の値を返せばいいと思う
            return 666;

        }


        public int EatJudge(int pnum1, int pnum2, int pnum3)
        {
            //eat,byteの数(初期値0)
            int eatnumber = 0;

            //プレイヤー、相手の数を格納する
            int[] player = new int[3] { pnum1, pnum2, pnum3 };

            int targetNum1 = 1;
            int targetNum2 = 2;
            int targetNum3 = 3;
            int[] enemy = new int[3] { targetNum1, targetNum2, targetNum3 };

            //eatbyte判定用
            int i = 0;
            int j = 0;

            for (i = 0; i < 3; i++)
            {
                //数値かつ場所が合っていれば、eat+1
                if (player[i].Equals(enemy[i]))
                {
                    eatnumber++;
                }

            }

            return eatnumber;
        }

        public int ByteJudge(int pnum1, int pnum2, int pnum3)
        {

            //eat,byteの数(初期値0)
            int eatnumber = 0;
            int bytenumber = 0;

            //プレイヤー、相手の数を格納する
            int[] player = new int[3] { pnum1, pnum2, pnum3 };

            int A1 = 123;
            int targetNum1 = A1 / 100;
            int targetNum2 = A1/10%10;
            int targetNum3 = A1%10;

            int[] enemy = new int[3] { targetNum1, targetNum2, targetNum3 };

            //eatbyte判定用
            int i = 0;
            int j = 0;

            for (i = 0; i < 3; i++)
            {
                //数値かつ場所が合っていれば、eat+1
                if (player[i].Equals(enemy[i]))
                {
                    eatnumber++;
                }

                for (j = 0; j < 3; j++)
                {
                    //数値が合っていれば、byte+1(eatも含まれている)
                    if (player[j].Equals(enemy[i]))
                    {
                        bytenumber++;
                    }

                }

            }

            bytenumber = bytenumber - eatnumber;

            return bytenumber;
        }
    }
}
